package com.swak.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.swak.annotation.table.Scene;
import com.swak.utils.StringUtils;

/**
 * 配置表
 * 
 * @author lifeng
 * @date 2020年10月7日 下午10:38:03
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Table {

	/**
	 * @return 配置表名，默认按照 "_" 取表名，如果有前缀需要重新定义表名
	 */
	String value() default StringUtils.EMPTY;

	/**
	 * 默认的使用场景
	 * 
	 * @return
	 */
	Scene scene() default Scene.Primary;
	
	/**
	 * 是否逻辑删除： 默认开启 
	 * 
	 * @return
	 */
	boolean useLogicDel() default true;
	
	/**
	 * 使用乐观锁: 默认是不开启
	 * 影响的语句： update、 updateSelective、updative
	 * 添加如下的片段（CAS）：
	 * ... SET ... VERSION = VERSION + 1 ... AND VERSION = #{version};
	 * 
	 * 所以实体属性 version 需要提前从数据库中查询出来；
	 * 
	 * @return
	 */
	boolean useOptimismLock() default false;
	
	/**
	 * 开启合并: insert -> update
	 * 
	 * @return
	 */
	boolean useMerge() default false;
	
	/**
	 * 开启行级锁: for update
	 * 注意： 使用此方法 必须要有索引，最好是唯一索引；否则转为表级锁；
	 * 
	 * @return
	 */
	boolean useLock() default false;
	
	/**
	 * 开启统计
	 * 
	 * @return
	 */
	@Deprecated
	boolean useStat() default false;
	
	/**
	 * 开启开关字段的更新
	 * 
	 * @return
	 */
	@Deprecated
	boolean useToggle() default false;
	
	/**
	 * 开启Insert转Update
	 * 
	 * @return
	 */
	@Deprecated
	boolean useReplace() default false;
	
	/**
	 * @return 分片表达式
	 *
	 */
	String shardingAlgorithm() default StringUtils.EMPTY;

	/**
	 * @return 分片实现类
	 */
	Class<?> shardingClass() default Void.class;

}